use crate::task::{exit_current_and_run_next, mmap, munmap, set_priority, suspend_current_and_run_next};
use crate::timer::get_time;

pub fn sys_exit(xstate: i32) -> ! {
    info!("[Kernel] Applicaion exited with code {}", xstate);
    exit_current_and_run_next();
    panic!("Unreachable in sys_exit!");
}

// 功能：应用主动交出 CPU 所有权并切换到其他应用。
// 返回值：总是返回 0。
// syscall ID：124
pub fn sys_yield() -> isize {
    suspend_current_and_run_next();
    0
}

/// 功能：获取当前的时间，以毫秒为单位。
/// 返回值：返回当前的时间，以毫秒为单位。
/// syscall ID：169
pub fn sys_get_time() -> isize {
    get_time() as isize
}

pub fn sys_set_priority(priority: isize) -> isize {
    set_priority(priority)
}

pub fn sys_mmap(start: usize, len: usize, port: usize) -> isize {
    mmap(start, len, port)
}

pub fn sys_munmap(start: usize, len: usize) -> isize {
    munmap(start, len)
}